using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace Projeto_Alice___Forca
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Seta seta;
        Letras[] letras = new Letras[26];
        Palavras palavras;
        Guilhotina guilhotina;
        ControleLetrasClicadas controleLetrasClicadas;
        Telas telas;
        Sublinhado sublinhado;
        Apresentacao apresentacao;
        Menu menu;
        Instrucoes instrucoes;
        Botao botaoJogar;
        Botao botaoInstrucoes;
        Botao botaoVoltarInstrucoes;
        FimDeJogo fimDeJogo;
        Dicas dicas;

        int intIndice;
        int intDesenhar;
        public int intVerificarToque;
        KeyboardState tecladoAtual;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            graphics.PreferredBackBufferWidth = 800;
            graphics.PreferredBackBufferHeight = 600;
        }

        protected override void Initialize()
        {
            base.Initialize();
            telas.definirTela(1); 
            //graphics.ToggleFullScreen();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            telas = new Telas();

            seta = new Seta(Content.Load<Texture2D>("mouse_fantasma"),
                            Content.Load<Texture2D>("mouse_fantasma2"));

            guilhotina = new Guilhotina(Content.Load<Texture2D>("guilhotina"),
                                        new Rectangle(0, 0, 300, 400),
                                        new Rectangle(0, 0, 300, 400));

            for (intIndice = 0; intIndice < letras.Length; intIndice++)
            {
                if (intIndice == 0)
                    letras[intIndice] = new Letras(Content.Load<Texture2D>("Letras"),
                    new Rectangle(100, 450, 43, 43),
                    new Rectangle(0, 0, 43, 43));

                else
                {
                    if (intIndice < 13)
                        letras[intIndice] = new Letras(Content.Load<Texture2D>("Letras"),
                        new Rectangle(letras[intIndice - 1].PosicaoTamanho.X + 47, letras[0].PosicaoTamanho.Y, 43, 43),
                        new Rectangle(letras[intIndice - 1].LocalLeituraTamanhoFrame.X + 43, 0, 43, 43));
                    else
                    {
                        if (intIndice == 13)
                            letras[intIndice] = new Letras(Content.Load<Texture2D>("Letras"),
                            new Rectangle(letras[0].PosicaoTamanho.X, letras[0].PosicaoTamanho.Y + 47, 43, 43),
                            new Rectangle(letras[intIndice - 1].LocalLeituraTamanhoFrame.X + 43, 0, 43, 43));
                        else
                            letras[intIndice] = new Letras(Content.Load<Texture2D>("Letras"),
                            new Rectangle(letras[intIndice - 1].PosicaoTamanho.X + 47, letras[0].PosicaoTamanho.Y + 47, 43, 43),
                            new Rectangle(letras[intIndice - 1].LocalLeituraTamanhoFrame.X + 43, 0, 43, 43));
                    }
                }
            }

            palavras = new Palavras(Content.Load<Texture2D>("Palavra_Alice"), Content.Load<Texture2D>("Palavra_Pessoinha"), Content.Load<Texture2D>("Palavra_FarpelaVoadora"), new Rectangle(400, 250, 43, 43), new Rectangle(0, 0, 43, 43));

            controleLetrasClicadas = new ControleLetrasClicadas();

            sublinhado = new Sublinhado(Content.Load<Texture2D>("Sublinhado"), new Rectangle(palavras.intpadraoPosicaoTamanho_X, 293, 43, 5));

            apresentacao = new Apresentacao(Content.Load<Texture2D>("Apresentacao"));

            menu = new Menu(Content.Load<Texture2D>("Menu"));

            botaoJogar = new Botao(Content.Load<Texture2D>("Jogar"), new Rectangle(150, 350, 204, 87), new Rectangle(0, 0, 204, 87));

            botaoInstrucoes = new Botao(Content.Load<Texture2D>("Instrucoes"), new Rectangle(450, 350, 250, 87), new Rectangle(0, 0, 250, 87));

            instrucoes = new Instrucoes(Content.Load<Texture2D>("TelaInstrucoes"));

            botaoVoltarInstrucoes = new Botao(Content.Load<Texture2D>("VoltarInstrucoes"), new Rectangle(10, 505, 200, 87), new Rectangle(0, 0, 200, 87));

            dicas = new Dicas(Content.Load<Texture2D>("Dica"), Content.Load<Texture2D>("Dicas123"), new Rectangle(700, 10, 80, 40), new Rectangle(0, 0, 80, 40), new Rectangle(350, 100, 400, 100), new Rectangle(0, 0, 400, 100));

            fimDeJogo = new FimDeJogo(Content.Load<Texture2D>("Ganhou"), Content.Load<Texture2D>("Perdeu"));
            // TODO: use this.Content to load your game content here
        }


        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            // TODO: Add your update logic here 
            
            if (telas.telaAtual == "Apresentacao")
            {
                if (apresentacao.opacidade > 3.0f)
                    telas.definirTela(2);
            }
            if (telas.telaAtual == "Menu")
            {
                if (botaoJogar.checarClique())
                {
                    palavras.definirPropriedades();
                    controleLetrasClicadas.definirPropriedades();
                    guilhotina.definirPropriedades();
                    fimDeJogo.definirPropriedades();
                    dicas.definirPropriedade();
                    for (intVerificarToque = 0; intVerificarToque < letras.Length; intVerificarToque++)
                        letras[intVerificarToque].definirPropriedades();


                    telas.definirTela(4);
                }

                if (botaoInstrucoes.checarClique())
                    telas.definirTela(3);
            }
            else if (telas.telaAtual == "Instrucoes")
            {
                if (botaoVoltarInstrucoes.checarClique())
                    telas.definirTela(2);
            }
            else if (telas.telaAtual == "Jogo")
            {
                if (controleLetrasClicadas.blnGanhou || controleLetrasClicadas.blnPerdeu)
                {
                    telas.definirTela(5);
                }
                else
                {
                    for (intVerificarToque = 0; intVerificarToque < letras.Length; intVerificarToque++)
                    {
                        if (letras[intVerificarToque].clicado(intVerificarToque))
                        {
                            if (palavras.checarCerto(letras[intVerificarToque].intNumeroLetra))
                                letras[intVerificarToque].boolLetraCerto = true;
                            else
                                letras[intVerificarToque].boolLetraErrado = true;

                            controleLetrasClicadas.checarEscolha(letras[intVerificarToque].boolLetraCerto, palavras.boolLetrasEscolhidas[intVerificarToque]);
                            palavras.boolLetrasEscolhidas[intVerificarToque] = true;
                        }

                        if (letras[intVerificarToque].boolLetraCerto)
                        {
                            letras[intVerificarToque].Textura = Content.Load<Texture2D>("LetrasCerto");
                        }
                        else if (letras[intVerificarToque].boolLetraErrado)
                        {
                            letras[intVerificarToque].Textura = Content.Load<Texture2D>("LetrasErrado");
                        }
                        else
                        {
                            if (letras[intVerificarToque].SombrearLetra())
                                letras[intVerificarToque].Textura = Content.Load<Texture2D>("LetrasSombra");
                            else if (!letras[intVerificarToque].SombrearLetra())
                                letras[intVerificarToque].Textura = Content.Load<Texture2D>("Letras");
                        }

                        guilhotina.MoverGuilhotina(controleLetrasClicadas.interros);
                        controleLetrasClicadas.checarQuantidadeDeEscolhas(palavras.intletrasDistintas);
                    }
                }
            }
            else if (telas.telaAtual == "FimDeJogo")
            {
                
            }

            tecladoAtual = Keyboard.GetState();
            if (Keyboard.GetState().IsKeyDown(Keys.Escape))
                this.Exit();

            if (Keyboard.GetState().IsKeyDown(Keys.F4))
                graphics.ToggleFullScreen();


            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);
            spriteBatch.Begin();

            if (telas.telaAtual == "Apresentacao")
            {
                GraphicsDevice.Clear(Color.Black);
                apresentacao.desenharApresentacao(spriteBatch);
            }
            if (telas.telaAtual == "Menu")
            {
                menu.desenharMenu(spriteBatch);
                botaoJogar.desenharBotao(spriteBatch);
                botaoInstrucoes.desenharBotao(spriteBatch);
            }
            else if (telas.telaAtual == "Instrucoes")
            {
                instrucoes.desenharInstrucoes(spriteBatch);
                botaoVoltarInstrucoes.desenharBotao(spriteBatch);
            }
            else if (telas.telaAtual == "Jogo")
            {
                dicas.ChecarClique();
                
                if (dicas.blndicaSolicitada)
                    dicas.mostrarDica(spriteBatch, palavras.intpalavra);

                spriteBatch.Draw(guilhotina.t2dGuilhotina, guilhotina.recPosicaoTamanho, guilhotina.recLocalLeituraTamanhoFrame, Color.White);

                sublinhado.desenharSublinhas(spriteBatch, palavras.inttamanhoPalavra, palavras.intpadraoPosicaoTamanho_X, palavras.inttaxaPosicaoTamanho_X);

                palavras.desenharLetrasAcertadas(spriteBatch);
                for (intDesenhar = 0; intDesenhar < letras.Length; intDesenhar++)
                    spriteBatch.Draw(letras[intDesenhar].Textura, letras[intDesenhar].PosicaoTamanho, letras[intDesenhar].LocalLeituraTamanhoFrame, Color.White);

                dicas.desenharDica(spriteBatch);

                
                //dicas.desenharDica(spriteBatch);
            }
            else if (telas.telaAtual == "FimDeJogo")
            {
                if (fimDeJogo.desenharResultado(spriteBatch, controleLetrasClicadas.blnGanhou))
                    telas.definirTela(2);
            }

            seta.Mover_seta();
            seta.Desenhar(spriteBatch);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}